<?php

if (!defined('BASEPATH'))
    exit('No direct script access allowed');

/**
 * Trieda určená na správu používateľov v databáze.
 * 
 * @author Michal Foltin
 */
class Admin_model extends CI_Model {

    function __construct() {
        parent::__construct();
    }

    /**
     * Metóda pridá používateľa do databázy.
     * 
     * @param array $data - údaje o pridávanom používateľovi
     * array (
     *      'user_info' = array(first_name, surname, department, user_type)
     *      'user_login' = array(username, password, isAdmin)
     * )
     * @return boolean - true ak sa pridanie podarilo, inak false
     */
    function addUser($data) {
        $this->db->trans_begin();
        if (!isset($data['user_info']['user_code']) || empty($data['user_info']['user_code'])) {
            $getLastId = $this->db->query("SELECT MAX(id) AS id FROM user_info;");
            $data['user_info']['user_code'] = "u" . ($getLastId->row()->id + 1);
        }
        $getUserCode = $this->db->get_where('user_info', array('user_code' => $data['user_info']['user_code']));
        if (wasError()) {
            return false;
        }
        if ($getUserCode->num_rows() != 0) {
            $this->db->trans_rollback();
            return false;
        } else {
            $this->db->insert('user_info', $data['user_info']);
            if (wasError()) {
                return false;
            }

            $getUserID = $this->db->get_where('user_info', $data['user_info']);
            if (wasError()) {
                return false;
            }
            $userID = $getUserID->row()->id;

            $data['user_login']['user_id'] = $userID;

            $this->db->insert('user_login', $data['user_login']);
            if (wasError()) {
                return false;
            }
        }
        $this->db->trans_commit();
        if (wasError()) {
            $this->db->trans_rollback();
            return false;
        } else {
            return true;
        }
    }

    /**
     * Metóda umožní upraviť informácie o používateľovi v databáze.
     * 
     * @param array $data
     * array (
     *      'user_id' => integer,
     *      'user_info' => array(user_code, first_name, surname, department, user_type) - pole upravovaných položiek
     *      'user_login' => array(username, password, isAdmin) - pole upravovaných položiek
     * )     
     * @return boolean - true ak sa update podaril, inak false
     */
    function editUser($data) {
        if (empty($data['user_info']) && empty($data['user_login'])) {
            return false;
        }
        $this->db->trans_begin();
        $where = array('id' => $data['user_id']);
        $getUser = $this->db->get_where('user_info', $where);
        if ($getUser->num_rows() == 0) {
            $this->db->trans_rollback();
            return false;
        }

        if (!empty($data['user_info'])) {
            $this->db->update('user_info', $data['user_info'], $where);
        }
        if (!empty($data['user_login'])) {
            $this->db->update('user_login', $data['user_login'], array('user_id' => $data['user_id']));
        }

        $this->db->trans_commit();
        if (wasError()) {
            $this->db->trans_rollback();
            return false;
        } else {
            return true;
        }
    }

    /**
     * Metóda odstráni používateľa z databázy.
     * 
     * @param array $data - id vymazávaného používateľa
     * array (
     *      'user_id' => integer,
     * )     
     * @return boolean - true ak sa odstránenie podarilo, inak false
     */
    function deleteUser($data) {
        $this->load->model('user_model');
        $this->db->trans_begin();
        $getUser = $this->db->get_where('user_info', array('id' => $data['user_id']));
        if ($getUser->num_rows() == 0) {
            $this->db->trans_rollback();
            return false;
        }

        $getEvents = $this->db->get_where('user_events', array('user_id' => $data['user_id']));
        foreach ($getEvents->result() as $row) {
            $deleteEvent = array(
                'event_id' => $row->event_id,
                'user_id' => $data['user_id']
            );
            if (!$this->user_model->deleteEvent($deleteEvent)) {
                $this->db->trans_rollback();
                return false;
            }
        }
        $this->db->delete('user_login', array('user_id' => $data['user_id']));
        if (wasError()) {
            return false;
        }
        $this->db->delete('user_info', array('id' => $data['user_id']));
        if (wasError()) {
            return false;
        }

        $this->db->trans_commit();
        if (wasError()) {
            $this->db->trans_rollback();
            return false;
        } else {
            return true;
        }
    }

    /**
     * Metóda vráti zoznam používateľov na základe podmienky $condition
     * 
     * @param array $condition - podmienka pre získanie používateľov
     * array (
     *      'user_id' => array(integer),
     *      'department' => array(string)
     * )
     * @return array - všetci používatelia vyhovujúci podmienke; asociatívne pole:
     * array(id, first_name, surname, department, user_type, username, is)
     */
    function getUsers($condition) {
        $getUsersQuery = "SELECT u.id, u.first_name, u.surname, u.department, u.user_type, ul.username, ul.isAdmin
                FROM user_info u
                INNER JOIN user_login ul ON u.id = ul.user_id
                WHERE 1=1 ";

        if (isset($condition['user_id']) && !empty($condition['user_id'])) {
            $getUsersQuery .= " AND u.id IN (";
            $getUsersQuery .= implode($condition['user_id'], ', ');
            $getUsersQuery .= ")";
        }
        
        if (isset($condition['department']) && !empty($condition['department'])) {
            $getUsersQuery .= " AND u.department IN ('";
            $getUsersQuery .= implode($condition['department'], "', '");
            $getUsersQuery .= "')";
        }

        $getUsersQuery .= "
            ORDER BY u.surname, u.first_name, u.id;";
        $getUsers = $this->db->query($getUsersQuery);

        if (wasError()) {
            return array();
        }

        return $getUsers->result_array();
    }

    /**
     * Metóda vymaže eventy z databázy.
     * 
     * @param array $data - array(event_id)
     * @return boolean - true ak sa vymazanie podarilo, inak false
     */
    function deleteEvents($data) {
        $this->db->trans_begin();

        $whereEvent = array('event_id' => $data['event_id']);
        $eventId = array('id' => $data['event_id']);

        $getUserEvents = $this->db->get_where('user_events', $whereEvent);

        if ($getUserEvents->num_rows() > 0) {
            $this->db->delete('user_events', $whereEvent);
            $this->db->delete('event', $eventId);
        } else {
            $this->db->trans_rollback();
            return false;
        }

        if (wasError()) {
            $this->db->trans_rollback();
            return false;
        } else {
            $this->db->trans_commit();
            return true;
        }
    }

    /**
     * Metóda vráti zoznam všetkých typov používateľov z databázy.
     * 
     * @return array - asociatívne štruktúrované pole (klúč => hodnota) na základe hlavičky tabuľky user_type.
     */
    function getUserTypes() {
        $query = $this->db->get('user_type');
        return $query->result_array();
    }

    /**
     * Metóda vráti log vykonaných dopytov z databázy na základe podmienky $condition
     * 
     * @param array $condition - podmienka pre získanie logov
     * array (
     *      'user_id' => array(integer),
     *      'modified' => array(min_time, max_time)
     * )
     * @return array - asociatívne štruktúrované pole (klúč => hodnota) na základe hlavičky tabuľky db_log.
     */
    function getLog($condition) {
        $getLogsQuery = "SELECT *
                FROM db_log l
                WHERE 1=1 ";

        if (isset($condition['user_id']) && !empty($condition['user_id'])) {
            $getLogsQuery .= " AND l.id IN (";
            $getLogsQuery .= implode($condition['user_id'], ', ');
            $getLogsQuery .= ")";
        }

        if (isset($condition['modified']) && isset($condition['modified'][0]) && isset($condition['modified'][1])) {
            $getLogsQuery .= " AND l.modified between " . $condition['modified'][0] . " AND " . $condition['modified'][1];
        }

        $getLogsQuery .= ";";
        $getLogs = $this->db->query($getLogsQuery);

        if (wasError()) {
            return array();
        }

        return $getLogs->result_array();
    }
    
    /**
     * Metóda vráti zoznam všetkých rôznych oddelení v databáze
     * 
     * @return array - asociaívne štruktúrované pole (kľúč => hodnota) 
     */
    function getDepartments() {
        $query = $this->db->query("SELECT DISTINCT department FROM user_info ORDER BY department;");
        return $query->result_array();
    }

}

?>
